package ar.uba.fi.algo3.modelo;

import java.util.ArrayList;

import ar.uba.fi.algo3.auxiliares.Posicion;
import ar.uba.fi.algo3.modelo.disparo.Disparo;
import ar.uba.fi.algo3.modelo.nave.Nave;

public class CampoBatalla {
	
	private static int anchoCasillero;
	private int altoCasillero;
	private ArrayList<Nave> navesDelCampo;
	private ArrayList<Disparo> disparosDelCampo;
	
	public CampoBatalla(){
       
		this.disparosDelCampo = new ArrayList <Disparo>();
		this.navesDelCampo = new ArrayList <Nave>();
		anchoCasillero=9;
		altoCasillero=9;			
	}

	public static int getAncho (){
		
		return anchoCasillero;
	}
	
	public int getAlto(){
		
		return this.altoCasillero;
	}

	public ArrayList<Disparo> getDisparos(){
		
		return this.disparosDelCampo;
	}
	
	public ArrayList<Nave> getNaves(){
		
		return this.navesDelCampo;
	}
	
	public ArrayList<Nave> buscarNaves(){
		
		ArrayList<Nave> naves= new ArrayList<Nave>();
		
		for (Nave unaNave: navesDelCampo){
			
			naves.add(unaNave);		
		}       
		return naves;
	}
	
	public ArrayList<Disparo> buscarDisparos(){
		
		ArrayList<Disparo> disparos= new ArrayList<Disparo>();
		
		for (Disparo unDisparo: disparosDelCampo){
				
			disparos.add(unDisparo);
		}		       
		return disparos;
	}
		
	public void insertarAlCampo(Nave unaNave){
        
		navesDelCampo.add(unaNave);
	}

	public void insertarAlCampo(Disparo unDisparo){
		
		disparosDelCampo.add(unDisparo);
	}

	public void removerDelCampo(Nave unaNave) {
         
		navesDelCampo.remove(unaNave);        
	}
	
	public void removerDelCampo(Disparo unDisparo) {
        
		disparosDelCampo.remove(unDisparo);        
	}
		
	public boolean fueraDelCampoBatalla (Posicion unaPosicion){
		
		if ((unaPosicion.getX()> CampoBatalla.getAncho()) || (unaPosicion.getX()<0)){
			
			return true;			
		}
		
		if ((unaPosicion.getY()>this.getAlto())|| (unaPosicion.getY()<0)){
			
			return true;
		}		
		
		return false;
	}

	public void pasoUnTurno() {
		
		ArrayList<Nave> naves = this.buscarNaves();
        ArrayList<Disparo> disparos = this.buscarDisparos();

        
		this.analizarDisparosDisponibles();
		
		this.ejecutarDisparos(naves,disparos);
		
		this.limpiarCampoDeBatalla(naves,disparos);
		
		this.moverNaves();
	}
	
	public void moverNaves(){
		
		for(Nave unaNave : navesDelCampo){
			
			unaNave.moverNaves();			
		}
	}
	
	public void analizarDisparosDisponibles(){
		
		for(Disparo unDisparo : disparosDelCampo){
			
			unDisparo.habilitarTurno();			
		}	
	}

	public void ejecutarDisparos(ArrayList<Nave> naves, ArrayList<Disparo> disparos){
	
        for(Nave unaNave : naves){
        	
        	for(Disparo unDisparo : disparos){
                	
        		unaNave.tocaA(unDisparo);
            }
        }		
	}
		
	private void limpiarCampoDeBatalla(ArrayList<Nave> naves, ArrayList<Disparo> disparos){
				
		this.actualizarNaves(naves);
		
		this.actualizarDisparos(disparos);
	}

	private void actualizarDisparos(ArrayList<Disparo> disparos) {
		
		for (Disparo unDisparo: disparos){
			
			if(!unDisparo.sigueFuncionando()){
				
				this.removerDelCampo(unDisparo);
			}
		}
	}

	private void actualizarNaves(ArrayList<Nave> naves) {
		
		for (Nave unaNave: naves){
			
			if(!unaNave.sigueFuncionando()){
				this.removerDelCampo(unaNave);
			}
		}
	}
	
	public boolean noHayNaves() {
       
        if(navesDelCampo.size()==0){
               
                return true;
        }
        return false;
	}
}

